/**
 * 翼支付APP金豆0点抢兑话费脚本
 * 适用于青龙面板
 * 
 * 功能说明：
 * 1. 自动登录翼支付APP
 * 2. 检查金豆数量
 * 3. 0点准时抢兑话费
 * 4. 记录兑换结果
 * 
 * 使用方法：
 * 1. 将脚本上传到青龙面板
 * 2. 配置环境变量：YIFUPAY_PHONE (手机号), YIFUPAY_PASSWORD (密码)
 * 3. 设置定时任务：0 0 * * * (每天0点执行)
 */

// 环境变量配置
const CONFIG = {
    phone: process.env.YIFUPAY_PHONE || '', // 手机号
    password: process.env.YIFUPAY_PASSWORD || '', // 密码
    exchangeAmount: process.env.YIFUPAY_EXCHANGE_AMOUNT || 10, // 兑换金额(元)
    minJindou: process.env.YIFUPAY_MIN_JINDOU || 100, // 最低金豆数量
    retryCount: 3, // 重试次数
    retryDelay: 1000 // 重试间隔(ms)
};

// 翼支付API配置
const API_CONFIG = {
    loginUrl: 'https://api.bestpay.com.cn/login',
    jindouUrl: 'https://api.bestpay.com.cn/jindou/query',
    exchangeUrl: 'https://api.bestpay.com.cn/jindou/exchange',
    userAgent: 'BestPay/8.0.0 (Android 11; SM-G975F)'
};

/**
 * 日志输出函数
 */
function log(message, type = 'info') {
    const timestamp = new Date().toLocaleString('zh-CN');
    const prefix = {
        'info': '📱',
        'success': '✅',
        'error': '❌',
        'warning': '⚠️'
    }[type] || '📱';
    
    console.log(`[${timestamp}] ${prefix} ${message}`);
}

/**
 * 延迟函数
 */
function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

/**
 * 翼支付登录
 */
async function login() {
    try {
        log('开始登录翼支付账户...');
        
        const response = await fetch(API_CONFIG.loginUrl, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
                'User-Agent': API_CONFIG.userAgent,
                'Authorization': `Bearer ${getStoredToken()}`
            },
            body: JSON.stringify({
                phone: CONFIG.phone,
                password: CONFIG.password,
                deviceId: generateDeviceId()
            })
        });

        if (!response.ok) {
            throw new Error(`登录请求失败: ${response.status}`);
        }

        const data = await response.json();
        
        if (data.code === 0) {
            storeToken(data.token);
            log(`登录成功，手机号：${CONFIG.phone}`, 'success');
            return true;
        } else {
            throw new Error(`登录失败: ${data.message}`);
        }
    } catch (error) {
        log(`登录异常: ${error.message}`, 'error');
        return false;
    }
}

/**
 * 获取金豆数量
 */
async function getJindouCount() {
    try {
        log('查询金豆数量...');
        
        const response = await fetch(API_CONFIG.jindouUrl, {
            method: 'GET',
            headers: {
                'Content-Type': 'application/json',
                'User-Agent': API_CONFIG.userAgent,
                'Authorization': `Bearer ${getStoredToken()}`
            }
        });

        if (!response.ok) {
            throw new Error(`查询金豆失败: ${response.status}`);
        }

        const data = await response.json();
        
        if (data.code === 0) {
            const jindouCount = data.data.jindouCount;
            log(`当前金豆数量: ${jindouCount}`, 'info');
            return jindouCount;
        } else {
            throw new Error(`查询失败: ${data.message}`);
        }
    } catch (error) {
        log(`查询金豆异常: ${error.message}`, 'error');
        return 0;
    }
}

/**
 * 兑换话费
 */
async function exchangePhoneBill() {
    try {
        log('开始兑换话费...');
        
        const response = await fetch(API_CONFIG.exchangeUrl, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
                'User-Agent': API_CONFIG.userAgent,
                'Authorization': `Bearer ${getStoredToken()}`
            },
            body: JSON.stringify({
                amount: CONFIG.exchangeAmount,
                type: 'phone_bill',
                timestamp: Date.now()
            })
        });

        if (!response.ok) {
            throw new Error(`兑换请求失败: ${response.status}`);
        }

        const data = await response.json();
        
        if (data.code === 0) {
            log(`话费兑换成功！兑换金额: ${CONFIG.exchangeAmount}元`, 'success');
            return true;
        } else {
            throw new Error(`兑换失败: ${data.message}`);
        }
    } catch (error) {
        log(`兑换异常: ${error.message}`, 'error');
        return false;
    }
}

/**
 * 检查兑换条件
 */
async function checkExchangeConditions() {
    // 检查时间是否接近0点
    const now = new Date();
    const minutesToMidnight = 60 - now.getMinutes();
    const secondsToMidnight = 60 - now.getSeconds();
    
    if (minutesToMidnight > 5) {
        log(`距离0点还有${minutesToMidnight}分钟，等待中...`);
        return false;
    }
    
    // 检查金豆数量
    const jindouCount = await getJindouCount();
    if (jindouCount < CONFIG.minJindou) {
        log(`金豆数量不足，当前: ${jindouCount}, 需要: ${CONFIG.minJindou}`, 'warning');
        return false;
    }
    
    return true;
}

/**
 * 等待到0点并执行兑换
 */
async function waitAndExecute() {
    log('开始等待0点执行兑换...');
    
    while (true) {
        const now = new Date();
        const isMidnight = now.getHours() === 0 && now.getMinutes() === 0;
        
        if (isMidnight) {
            log('🕛 到达0点，开始执行兑换！');
            
            // 连续尝试兑换，直到成功或达到重试次数
            for (let i = 0; i < CONFIG.retryCount; i++) {
                try {
                    const success = await exchangePhoneBill();
                    if (success) {
                        log(`兑换成功！第${i + 1}次尝试`, 'success');
                        return true;
                    }
                } catch (error) {
                    log(`第${i + 1}次尝试失败: ${error.message}`, 'error');
                }
                
                if (i < CONFIG.retryCount - 1) {
                    log(`等待${CONFIG.retryDelay}ms后重试...`);
                    await sleep(CONFIG.retryDelay);
                }
            }
            
            log('所有重试次数已用完，兑换失败', 'error');
            return false;
        }
        
        // 每秒检查一次
        await sleep(1000);
    }
}

/**
 * 生成设备ID
 */
function generateDeviceId() {
    return 'android_' + Math.random().toString(36).substr(2, 16);
}

/**
 * 获取存储的Token
 */
function getStoredToken() {
    // 这里应该从本地存储或环境变量中获取token
    return process.env.YIFUPAY_TOKEN || '';
}

/**
 * 存储Token
 */
function storeToken(token) {
    // 这里应该将token存储到本地或环境变量
    process.env.YIFUPAY_TOKEN = token;
}

/**
 * 主函数
 */
async function main() {
    try {
        log('=== 翼支付金豆0点抢兑话费脚本开始执行 ===');
        
        // 检查配置
        if (!CONFIG.phone || !CONFIG.password) {
            log('请配置环境变量: YIFUPAY_PHONE 和 YIFUPAY_PASSWORD', 'error');
            return;
        }
        
        // 登录
        if (!await login()) {
            log('登录失败，程序退出', 'error');
            return;
        }
        
        // 检查兑换条件
        const canExchange = await checkExchangeConditions();
        if (!canExchange) {
            log('条件不满足，程序退出', 'warning');
            return;
        }
        
        // 等待并执行兑换
        const result = await waitAndExecute();
        
        if (result) {
            log('=== 脚本执行完成 - 兑换成功 ===', 'success');
        } else {
            log('=== 脚本执行完成 - 兑换失败 ===', 'error');
        }
        
    } catch (error) {
        log(`脚本执行异常: ${error.message}`, 'error');
    }
}

// 如果直接运行此脚本
if (require.main === module) {
    main().catch(error => {
        log(`未捕获的异常: ${error.message}`, 'error');
        process.exit(1);
    });
}

// 导出函数供青龙面板调用
module.exports = {
    main,
    config: CONFIG
};